﻿using System;
using System.Linq;
using InfoInterviewServiceApp.DAL;
using InfoInterviewServiceApp.Entity;
using InfoInterviewServiceApp.Requests;
using InfoInterviewServiceApp.Responses;
using InfoInterviewServiceApp.ServiceContract;

namespace InfoInterviewServiceApp
{
    public class InterviewService : IInterviewService
    {
        public GetAllDomandeByTipologiaTestResponse GetAllDomandeByTipologiaTest(GetAllDomandeByTipologiaTestRequest request)
        {
            using (QuizDBEntities a = new QuizDBEntities())
            {
                var list = a.Domande.Where(c => c.IdTipologiaTest == request.idTipologiaTest);
                var listaDomandeService = (from elemento in list
                                           select new DomandaService()
                                           {
                                               IdDomanda = elemento.IdDomanda,
                                               Domanda = elemento.Domanda,
                                               IdTipologiaTest = (long)elemento.IdTipologiaTest
                                           }).ToArray();

                return new GetAllDomandeByTipologiaTestResponse() { response = listaDomandeService };
            }
        }

        //public GetAllRisposteByColloquioResponse GetAllRisposteByColloquio(GetAllRisposteByColloquioRequest request)
        //{
        //    using (InfosDBEntities a = new InfosDBEntities())
        //    {

        //        var list = a.Rispostes.Where(r => r.IdColloquio == request.idColloquio);
        //        var listaRisposta =
        //        (from elemento in list
        //         select new RispostaService()
        //         {
        //             Descrizione = elemento.Descrizione,
        //             IdRisposta = elemento.IdRisposta,
        //             Voto = elemento.Voto
        //         }).ToArray();
        //        return new GetAllRisposteByColloquioResponse() { response = listaRisposta };
        //    }
        //}

        public GetAllTipologieResponse GetAllTipologie()
        {
            using (QuizDBEntities a = new QuizDBEntities())
            {
                var list = a.TipologiaTest.OrderBy(x => x.Descrizione);
                var listaRisposta =
                 (from elemento in list
                  select new TipologiaTestService()
                  {
                      Descrizione = elemento.Descrizione,
                      DataCreazione = elemento.DataCreazione,
                      IdTipologiaTest = elemento.IdTipologiaTest
                  }).ToArray();
                return new GetAllTipologieResponse() { ListaTest = listaRisposta };
            }
        }

        public GetAllPersoneResponse GetAllPersone()
        {
            //using (InfosDBEntities a = new InfosDBEntities())
            //{
            //    var list = a.Persones.OrderBy(x => x.Cognome);
            //    var listaPersone =
            //     (from elemento in list
            //      select new PersoneService()
            //      {
            //          Cellulare = elemento.Cellulare,
            //          Cognome = elemento.Cognome,
            //          DataNascita = elemento.DataNascita,
            //          Foto = elemento.Foto,
            //          IdPersona = elemento.IdPersona,
            //          IdSettoreAziendale = elemento.IdSettoreAziendale,
            //          Nome = elemento.Nome,
            //          TelefonoCasa = elemento.TelefonoCasa,
            //          Via = elemento.Via
            //      }).ToArray();
            return new GetAllPersoneResponse() { ListaPersone = null };//listaPersone };
            //            }
        }

        public GetAllDifficoltaResponse GetAllDifficolta()
        {
            using (QuizDBEntities a = new QuizDBEntities())
            {
                var list = a.Difficolta.OrderBy(x => x.IDDifficolta);
                var listaDifficolta =
                 (from elemento in list
                  select new DifficoltaService()
                  {
                      IDDifficolta = elemento.IDDifficolta,
                      NumMaxDomande = elemento.NumMaxDomande,
                      TempoMaxDomande = elemento.TempoMaxDomande,
                      Titolo = elemento.Titolo,
                  }).ToArray();
                return new GetAllDifficoltaResponse() { ListaDifficolta = listaDifficolta };
            }
        }

        /// <summary>
        /// Metodo che elabora costruisce un questionario in relazione alla tipologia di test e alla difficoltà
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public GetAllQuestionarioResponse GetAllQuestionario(GetAllQuestionarioRequest request)
        {
            try
            {
                using (QuizDBEntities a = new QuizDBEntities())
                {
                    var Dif = a.Difficolta.Where(x => x.IDDifficolta == request.IdDifficolta).Single();


                    var filtrolista = a.Domande.Where(x => x.IdTipologiaTest == request.idTipologiaTest).ToList();
                    var listaDomande = (from elemento in InfoInterviewServiceApp.BL.Filtro<Domande>.FiltraDifficolta(filtrolista, Dif.NumMaxDomande)
                                        select new DomandaService()
                                        {
                                            Domanda = elemento.Domanda,
                                            IdDomanda = elemento.IdDomanda,
                                            IdTipologiaTest = elemento.IdTipologiaTest,
                                            PossibiliRisposte =
                                            (from posRisp in elemento.PossibiliRisposte
                                             select new PossibiliRisposteService()
                                             {
                                                 DescrizioneRisposta = posRisp.DescrizioneRisposta,
                                                 IdDomanda = posRisp.IdDomanda,
                                                 IdPossibileRisposta = posRisp.IdPossibileRisposta,
                                                 IsCorretta = posRisp.IsCorretta
                                             }).ToArray()

                                        }).ToArray();
                    var response = new GetAllQuestionarioResponse();
                    response.Difficolta = new DifficoltaService()
                    {
                        IDDifficolta = Dif.IDDifficolta,
                        NumMaxDomande = Dif.NumMaxDomande,
                        TempoMaxDomande = Dif.TempoMaxDomande,
                        Titolo = Dif.Titolo
                    };
                    response.Questionario.ListaDomande = listaDomande;
                    response.Questionario.NomeQuestionario = a.TipologiaTest.Where(x => x.IdTipologiaTest == request.idTipologiaTest).Single().Descrizione;
                    return response;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public SetPunteggioResponse SetPunteggio(SetPunteggioRequest request)
        {
            try
            {
                using (QuizDBEntities dbInfos = new QuizDBEntities())
                {
                    Punteggi punt = new Punteggi()
                    {
                        IdDifficolta = request.IdDifficolta,
                        IdTipologiaTest = request.IdTipologiaTest,
                        Punteggio = request.Punteggio,
                        Account= request.Username
                    };
                    var PunteggioInserito = dbInfos.Punteggi.Add(punt);
                    dbInfos.SaveChanges();
                    var esito = new SetPunteggioResponse();
                    esito.PunteggioAggiornato = new PunteggioService()
                    {
                        IdDifficolta = (int)PunteggioInserito.IdDifficolta,
                        IdPunteggio = PunteggioInserito.IdPunteggio,
                        IdTipologiaTest = (int)PunteggioInserito.IdTipologiaTest,
                        Punteggio = (long)PunteggioInserito.Punteggio
                    };
                    return esito;
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        public GetListPunteggioResponse GetListPunteggio(GetListPunteggioRequest request)
        {
            try
            {
                using (QuizDBEntities dbInfos = new QuizDBEntities())
                {
                    var ListElement = dbInfos.Punteggi.Where(x => x.Difficolta.IDDifficolta == request.PunteggioAttuale.IdDifficolta
                                                                    && x.IdTipologiaTest == request.PunteggioAttuale.IdTipologiaTest)
                                                                    .OrderByDescending(x => x.Punteggio)
                        //               .Skip(3)
                        //               .Take(4)
                                                                    .ToList();
                    var esito = new GetListPunteggioResponse()
                    {
                        ListPunteggi = (from p in ListElement
                                        select new PunteggioService()
                                        {
                                            Index = ListElement.IndexOf(p) + 1,
                                            IdDifficolta = (int)p.IdDifficolta,
                                            IdPunteggio = p.IdPunteggio,
                                            IdTipologiaTest = (int)p.IdTipologiaTest,
                                            Punteggio = (long)p.Punteggio,
                                            IsActual = p.IdPunteggio == request.PunteggioAttuale.IdPunteggio ? true : false,
                                            UserName = p.Account,
                                        }).ToArray()
                    };
                    return esito;
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}
